/**
 * 
 */
package les.portal.testes;

import junit.framework.TestCase;
import les.portal.excecoes.EmailInvalidoException;
import les.portal.excecoes.EmailNuloException;
import les.portal.excecoes.NomeNuloException;
import les.portal.excecoes.PortalException;
import les.portal.negocio.dao.DesenvolvedorDAO;
import les.portal.negocio.facade.SuperFacade;
import les.portal.negocio.to.DesenvolvedorTO;
import les.portal.util.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 * Teste para a classe DesenvolvedorDAO.
 * @author Anne Caroline, Bruno Coitinho, Gustavo de Farias e Maria de Lourdes
 * @version 1.0
 */

public class DesenvolvedorDAOTest extends TestCase {

	DesenvolvedorTO des1TO = new DesenvolvedorTO();

	DesenvolvedorTO des2TO = new DesenvolvedorTO();

	DesenvolvedorDAO desenvolvedorDAO = null;

	Session sessao = HibernateUtil.currentSession();

	/*
	 * @see TestCase#setUp()
	 */
	protected void setUp() throws Exception {
		super.setUp();
		SuperFacade superFacade = new SuperFacade();

		superFacade.zerarSistema();

		desenvolvedorDAO = new DesenvolvedorDAO(sessao);

		des1TO.setNome("Desenvolvedor Teste 1");
		des1TO.setEmail("des1@mail.com");
		des1TO.setProjeto(null);

		des2TO.setNome("Desenvolvedor Teste 2");
		des2TO.setEmail("des2@mail.com");
		des2TO.setProjeto(null);

	}

	/*
	 * Test method for
	 * 'les.portal.negocio.dao.DesenvolvedorDAO.readAPartirDoNome(String)'
	 */
	public void testReadAPartirDoNome() throws NomeNuloException,
			EmailNuloException, EmailInvalidoException {

		assertNull(des1TO.getId());
		assertNull(desenvolvedorDAO.readAPartirDoNome("Desenvolvedor Teste 1"));

		des1TO.setNome("Desenvolvedor Teste 1");
		des1TO.setEmail("des@mail.com");

		Transaction t = sessao.beginTransaction();

		desenvolvedorDAO.create(des1TO);
		t.commit();

		assertNotNull(desenvolvedorDAO
				.readAPartirDoNome("Desenvolvedor Teste 1"));
		
		t = sessao.beginTransaction();
		desenvolvedorDAO.removeAll();
		t.commit();

	}

	/*
	 * Test method for
	 * 'les.portal.negocio.dao.DesenvolvedorDAO.create(DesenvolvedorTO)'
	 */
	public void testCreateDesenvolvedorTO() {

		Transaction t = sessao.beginTransaction();

		Integer id2 = desenvolvedorDAO.create(des2TO);
		t.commit();

		assertEquals(id2, des2TO.getId());
		assertNotNull(desenvolvedorDAO
				.readAPartirDoNome("Desenvolvedor Teste 2"));
		assertEquals(id2, desenvolvedorDAO.read(id2).getId());
		assertEquals("Desenvolvedor Teste 2", desenvolvedorDAO.read(id2)
				.getNome());
		assertEquals("des2@mail.com", desenvolvedorDAO.read(id2).getEmail());
		
		t = sessao.beginTransaction();
		desenvolvedorDAO.removeAll();
		t.commit();
	}

	/*
	 * Test method for 'les.portal.negocio.dao.DesenvolvedorDAO.read(Integer)'
	 */
	public void testReadInteger() {

		Transaction t = sessao.beginTransaction();

		Integer id1 = desenvolvedorDAO.create(des1TO);
		t.commit();

		assertNotNull(desenvolvedorDAO.read(DesenvolvedorTO.class, id1));
		
		t = sessao.beginTransaction();
		desenvolvedorDAO.removeAll();
		t.commit();
	}

	/*
	 * Test method for
	 * 'les.portal.negocio.dao.DesenvolvedorDAO.update(DesenvolvedorTO)'
	 */
	public void testUpdateDesenvolvedorTO() throws NomeNuloException {
		Transaction t = sessao.beginTransaction();

		Integer id1 = desenvolvedorDAO.create(des1TO);
		t.commit();
		
		DesenvolvedorTO d1 = desenvolvedorDAO.read(id1);
		
		assertEquals("Desenvolvedor Teste 1", d1.getNome());
		assertEquals("des1@mail.com", d1.getEmail());		
		
		d1.setNome("Des Teste 1");
		
		t = sessao.beginTransaction();
		desenvolvedorDAO.update(d1);
		t.commit();
				
		assertEquals("Des Teste 1", d1.getNome());
		assertEquals("des1@mail.com", d1.getEmail());
		
		t = sessao.beginTransaction();
		desenvolvedorDAO.removeAll();
		t.commit();

	}

	/*
	 * Test method for
	 * 'les.portal.negocio.dao.DesenvolvedorDAO.delete(DesenvolvedorTO)'
	 */
	public void testDeleteDesenvolvedorTO() {

		Transaction t = sessao.beginTransaction();

		Integer id1 = desenvolvedorDAO.create(des1TO);
		Integer id2 = desenvolvedorDAO.create(des2TO);
		t.commit();

		assertNotNull(desenvolvedorDAO.read(DesenvolvedorTO.class, id1));
		assertNotNull(desenvolvedorDAO.read(DesenvolvedorTO.class, id2));

		t = sessao.beginTransaction();
		desenvolvedorDAO.delete(des1TO);
		desenvolvedorDAO.delete(des2TO);
		t.commit();
		assertNull(desenvolvedorDAO.read(DesenvolvedorTO.class, id1));
		assertNull(desenvolvedorDAO.read(DesenvolvedorTO.class, id2));
	
	}

	/*
	 * Test method for 'les.portal.negocio.dao.DesenvolvedorDAO.list()'
	 */
	public void testList() throws PortalException {

		Transaction t = sessao.beginTransaction();

		desenvolvedorDAO.create(des1TO);
		desenvolvedorDAO.create(des2TO);

		t.commit();

		assertEquals(2, desenvolvedorDAO.list().size());
		assertEquals("[" + des1TO.getNome() + ", " + des2TO.getNome() + "]",
				desenvolvedorDAO.list().toString());
		
		t = sessao.beginTransaction();
		desenvolvedorDAO.removeAll();
		t.commit();

	}

	/*
	 * Test method for 'les.portal.negocio.dao.DesenvolvedorDAO.removeAll()'
	 */
	public void testRemoveAll() throws PortalException {

		Transaction t = sessao.beginTransaction();

		desenvolvedorDAO.create(des1TO);
		desenvolvedorDAO.create(des2TO);
		t.commit();

		assertEquals(2, desenvolvedorDAO.list().size());

		t = sessao.beginTransaction();
		desenvolvedorDAO.removeAll();
		t.commit();

		assertEquals(0, desenvolvedorDAO.list().size());
		
	}


}
